from datetime import datetime

from aiogram import Router, F
from aiogram.filters import CommandStart, CommandObject, Command
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message, InlineKeyboardMarkup, InlineKeyboardButton, WebAppData

from api import API
from keyboards import *
from logs import SingletonLogger
from middlewares.logger_middleware import LoggerMessageMiddleware, LoggerCallMiddleware

router: Router = Router()

router.message.middleware(LoggerMessageMiddleware())
router.callback_query.middleware(LoggerCallMiddleware())

logger = SingletonLogger.get_instance(__name__).get_logger()

api = API()


def convert_time_format(time_str):
    try:
        dt = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ")
    except ValueError:
        dt = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%SZ")
    return dt.strftime("%Y.%m.%d в %H:%M")


@router.message(CommandStart())
async def start_command(message: Message, state: FSMContext):
    tg_user = message.from_user
    result = api.get(f'user/{tg_user.id}')
    if not result:
        result = api.post(
            endpoint='user',
            data={
                'id': tg_user.id,
                'username': tg_user.username,
                'first_name': tg_user.first_name,
                'last_name': tg_user.last_name,
                'is_admin': False
            }
        )
        if result:
            text = f'''
<b>Привет, {tg_user.first_name}!</b>

Ты у нас первый раз ? 
Нажми /help, чтобы узнать, что я умею.
Туры: /tours
Мои туры: /my_tours
'''
        else:
            text = f'''
<b>Привет, {tg_user.first_name}!</b>

Произошла ошибка при регистрации.
Попробуйте позже.'''
    else:
        text = f'''
<b>Привет, {tg_user.first_name}!</b>
        
Ты уже зарегистрирован в системе.

Туры: /tours
Мои туры: /my_tours
'''
    await message.answer(text)


@router.message(Command('tours'))
async def tours_command(message: Message, command: CommandObject, state: FSMContext):
    text = f'''
<b>Здесь ты можешь выбрать туры!</b>
    
Нажми на кнопку ниже, чтобы увидеть доступные туры.'''
    await message.answer(text, reply_markup=create_webapp())


@router.message(Command('my_tours'))
async def my_tours_command(message: Message = None, call: CallbackQuery = None, state: FSMContext = None):
    text = f'''
<b>Здесь ты можешь посмотреть свои туры!</b>
    
Нажми на кнопку ниже, чтобы увидеть свои туры.'''
    if message:
        await message.answer(text, reply_markup=create_my_tours())
    elif call:
        await call.message.edit_text(text, reply_markup=create_my_tours())


@router.message(Command('help'))
async def help_command(message: Message, command: CommandObject, state: FSMContext):
    text = f'''
    <b>Привет, юзер!</b>
С помощью этого сервиса ты можешь забронировать туры.
Нажми на кнопку ниже, чтобы увидеть доступные туры.
    '''
    await message.answer(text, reply_markup=create_webapp())


async def my_tours(call: CallbackQuery, state: FSMContext):
    bookings = api.get(f'booking/user/{call.from_user.id}')
    text = '<b>Ваши туры:</b>\n\n'
    if bookings:
        bookings_ids = [booking['tour_id'] for booking in bookings]
        tours = [api.get(f'tour/{booking_id}') for booking_id in bookings_ids]
        for tour in tours:
            text += f'{tour['name']}'
    else:
        text = 'У вас нет туров.'

    await call.message.edit_text(text, reply_markup=create_return())
    await state.update_data(step='my_tours', return_to='my_tours_command')


@router.callback_query()
async def callback_handler(call: CallbackQuery, state: FSMContext):
    call_data = call.data
    state_data = await state.get_data()
    step = state_data.get('step')
    return_to = state_data.get('return_to')

    if call_data == 'my_tours':
        await my_tours(call, state)
    elif call_data == 'return':
        if step == 'my_tours':
            if return_to == 'my_tours_command':
                await my_tours_command(call=call, state=state)
